/**
 * 1、>> 有符号向右移位
 *      对于正整数，>> 操作会在 高位补充 0 ，低位部分被挤掉
 *      对于负整数，>> 操作会在 高位补充 1 ，低位部分被挤掉
 * 
 * 2、<< 向左移位
 *      高位被挤掉，在低位补充 0 
 * 
 * 3、>>> 无符号向右移位
 *      无论正整数还是负整数，都是在高位补充零，低位被挤掉
 */

let x = 0b0000_0000_0000_0000_0000_0000_0001_0101 ;
console.log( x );

// >> 对于正整数来说，向右移位会挤掉低位部分，并在高位补充零
let a = x >> 1 ; // 0_0000_0000_0000_0000_0000_0000_0001_010
console.log( a );

let b = x >> 2 ; // 00_0000_0000_0000_0000_0000_0000_0001_01
console.log( b );

let c = x >> 3 ; // 000_0000_0000_0000_0000_0000_0000_0001_0
console.log( c );

// 这个不做要求
let d = x >> 32 ; // 0000_0000_0000_0000_0000_0000_0001_0101
console.log( d );

console.log( '- - - - - - - - - - - - - - - - - -' );

let y = 0b0000_0000_0000_0000_0000_0000_0000_0101 ;
console.log( y );

// << 对于整数来说，向左移位会挤掉高位部分，并在低位补充零
let m = y << 1 ; // 000_0000_0000_0000_0000_0000_0000_0101_0
console.log( m );

let n = y << 2 ; // 00_0000_0000_0000_0000_0000_0000_0101_00
console.log( n );

let p = y << 3 ; // 0_0000_0000_0000_0000_0000_0000_0101_000
console.log( p );

let t = y << 29 ; // 101_0_0000_0000_0000_0000_0000_0000_0000
console.log( t );

// 这个不做要求
let s = y << 256 ; // 0000_0000_0000_0000_0000_0000_0000_0101
console.log( s );

console.log( '- - - - - - - - - - - - - - - - - -' );

let h = -5 ; // 1111_1111_1111_1111_1111_1111_1111_1011
console.log( h );

// >> 对于负整数来说，向右移位会挤掉低位部分，并在高位补充一
let u = h >> 1 ; // 1_1111_1111_1111_1111_1111_1111_1111_101
console.log( u );

let w = h >> 2 ; // 11_1111_1111_1111_1111_1111_1111_1111_10
console.log( w );

let r = h >> 3 ; // 111_1111_1111_1111_1111_1111_1111_1111_1
console.log( r );

console.log( '- - - - - - - - - - - - - - - - - -' );

console.log( 'y = ' , y , ' h = ' , h );
// >>> 表示无符号向右移位，无论正整数还是负整数，都是在高位补充零，低位被挤掉
let i = y >>> 1 ; // 0_0000_0000_0000_0000_0000_0000_0000_010
let j = h >>> 1 ; // 0_1111_1111_1111_1111_1111_1111_1111_101
console.log( 'i = ' , i , ' j = ' , j );


